package co.gov.medellin.sdep.sisdep.integration.sapbapirentws;

import java.util.ArrayList;
import java.util.List;

import javax.xml.rpc.holders.StringHolder;

import co.gov.medellin.sdep.sisdep.integration.sapbapirentws.holders.Bapiret2Holder;
import co.gov.medellin.sdep.sisdep.integration.sapbapirentws.holders.TableOfZstEspuplicoSaldoContribHolder;

/**
 * Clase que permite realizar consultas al Sistema SAP R3 de informacion sobre un contribuyente
 * y sus saldos asociados con la Alcadia de Medellin.
 * 
 * @author carlos.perez@consult-soft.com
 * @version 20-04-2012 
 */
public class SAPRentasWSClient implements java.io.Serializable {
	
	/** Serial key. */
	private static final long serialVersionUID = -1184756756575700426L;
	
	private String endPoint;
	private String user;
	private String password;
	
	private ZWS_ESPUBLICO_Service sapRentWS;
	private ZWS_ESPUBLICO_PortType sapRentPort;
	
	/**
	 * Metodo que realiza la inicializacion de los objetos necesarios para el acceso 
	 * al servicio WEB de SAP Rentas. Este metodo se debe usar en el 
	 * en el portal SAP de la Alcaldia pues hace uso del Servicio WEB de SAP Rentas que NO esta
	 * disponible localmente en un entorno de DLLO.
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 02-05-2012
	 *  
	 */
	private void setupWSClient() throws Exception {
		sapRentWS = new ZWS_ESPUBLICO_ServiceLocator(getEndPoint());
		sapRentPort = sapRentWS.getZWS_ESPUBLICO();
		((org.apache.axis.client.Stub)sapRentPort).setUsername(getUser());
		((org.apache.axis.client.Stub)sapRentPort).setPassword(getPassword()); 
	}
	
	/**
	 * Metodo que establece un valor de NULO para el endPoint del Servicio de SAP Rentas. 
	 * Este metodo se debe usar en el entorno de DLLO local con el fin de realizar la 
	 * implementacion de los modulos que necesiten simular una consulta de SAP Rentas.
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 02-05-2012
	 *  
	 */
	private void setupWSClientDefault() {
		sapRentPort = null;
	}

	/**
	 * Metodo que permite consultar los datos de una persona que tenga infomacion asociada con la
	 * Alcaldia de Medellin.
	 * NOTA: Se envia como parametro de invocacion el numero de cedula de ciudadania.
	 * 
	 * @param documentID
	 * @return ContribuyenteSAPData
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 30-04-2012 
	 * 
	 */
	public ContribuyenteSAPData getContribuyenteSAPData(String documentID) {
		ContribuyenteSAPData contribTO = new ContribuyenteSAPData();
		
		// Se verifica el acceso al endPoint de servicio WEB:
		if(sapRentPort != null) {
			StringHolder exComuna = new StringHolder("");
			StringHolder exDireccion = new StringHolder("");
			StringHolder exEmail = new StringHolder("");
			StringHolder exNif = new StringHolder("");
			StringHolder exNombre = new StringHolder("");
			StringHolder exPoblacion = new StringHolder("");
			Bapiret2Holder exReturn = new Bapiret2Holder();
			StringHolder exTelefono = new StringHolder("");
	            
			try {
				// La invocacion de este metodo realiza una incializacion de parametros IN/OUT:
				sapRentPort.ZBapiBuscarContrib(documentID, exComuna, exDireccion, exEmail, exNif, exNombre, exPoblacion, exReturn, exTelefono);
				contribTO.setComuna(exComuna.value);
				contribTO.setDireccion(exDireccion.value);
				contribTO.setEmail(exEmail.value);
				contribTO.setNif(exNif.value); // Numero de Identificacion Fiscal : NIF
				contribTO.setPoblacion(exPoblacion.value);
				contribTO.setNombre(exNombre.value);
				contribTO.setReturnNumber(exReturn.value.getNumber());
				contribTO.setTelefono(exTelefono.value);
	
			} catch(Exception e) {
				System.err.println("SISDEP::SAPRentasWSClient.getContribuyenteSAPData(documentID)-->" + documentID);
				e.printStackTrace(System.err);			
			}
		}
		return contribTO;
	}
	
	/**
	 * Metodo que permite consultar el listado de items con los Saldos de una persona 
	 * que tenga infomacion asociada con la Alcaldia de Medellin.
	 * NOTA: Se envia como parametro de invocacion el numero de cedula de ciudadania.
	 * 
	 * @param documentID
	 * @return List<ZstEspuplicoSaldoContrib>
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 30-04-2012
	 *  
	 */
	public List getSaldoContribuyenteSAPList(String documentID) {
		List saldoItemList = null;
		
		// Se verifica el acceso al endPoint de servicio WEB:
		if(sapRentPort != null) {
			try {
				ZstEspuplicoSaldoContrib[] itemsArray = new ZstEspuplicoSaldoContrib[1];
				ZstEspuplicoSaldoContrib itemCall = new ZstEspuplicoSaldoContrib("","","","","",null,"","","","");
				itemsArray[0] = itemCall;
		
				TableOfZstEspuplicoSaldoContribHolder extraCall = new TableOfZstEspuplicoSaldoContribHolder();
				extraCall.value = itemsArray;
				
				Bapiret2 response = sapRentPort.ZBapiEspublicoContribSaldo(documentID, extraCall);
				if(response.getMessage() != null) {
					// TODO: Vefificar en caso de ERROR
				}
				saldoItemList = new ArrayList(extraCall.value.length);
				for(int k = 0;k < extraCall.value.length; k++) {
					ZstEspuplicoSaldoContrib item = extraCall.value[k];
					saldoItemList.add(item);
				}
			} catch(Exception e) {
				System.err.println("SISDEP::SAPRentasWSClient.getSaldoContribuyenteSAPList(documentID)-->" + documentID);
				e.printStackTrace(System.err);			
			}
		}
		return saldoItemList;
	}
	
	/**
	 * @return
	 */
	public String getEndPoint() {
		return endPoint;
	}

	/**
	 * @param string
	 */
	public void setEndPoint(String string) {
		endPoint = string;
	}

	/**
	 * @return the user
	 */
	public String getUser() {
		return user;
	}

	/**
	 * @param user the user to set
	 */
	public void setUser(String user) {
		this.user = user;
	}

	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}

}
